package net.jacqeush.mini.rpc.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import net.jacqeush.mini.rpc.tools.SerializationUtils;


import java.util.List;

/**
 * @author Jacquesh
 * @version 1.0
 * @date 2020/10/16 3:14
 */

public class Decoder extends ByteToMessageDecoder{
    private int minLength = 4;
    private Class<?> genericsClass;

    public Decoder(Class<?> genericsClass) {
        this.genericsClass = genericsClass;
    }
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf buf, List<Object> list) throws Exception {
        //	如果请求数据包 不足4个字节 直接返回, 如果大于等于4个字节 那么程序继续执行
        if(buf.readableBytes() < minLength) {
            return;
        }

        //	首先记录一下当前的位置
        buf.markReaderIndex();
        //	当前请求数据包的大小读取出来
        int dataLength = buf.readInt();
        if(buf.readableBytes() < dataLength) {
            buf.resetReaderIndex();
            return;
        }

        //	真正读取需要长度的数据包内容
        byte[] data = new byte[dataLength];
        buf.readBytes(data);

        // 	解码操作 返回指定的对象
        Object obj = SerializationUtils.deserialize(data, genericsClass);
        //	填充到buffer中，传播给下游handler做实际的处理
        list.add(obj);
    }
}
